www.gusucode.com > 一个早期的VC++ Modem拨号程序代码源码程序 > 一个早期的VC++ Modem拨号程序代码/语音电话高级编程/语音电话高级编程/modemDlg.cpp

    // modemDlg.cpp : implementation file
//

#include "stdafx.h"
#include "modem.h"
#include "modemDlg.h"




#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

static BOOL bClicked = FALSE;



/////////////////////////////////////////////////////////////////////////////
// CModemDlg dialog

CModemDlg::CModemDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CModemDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CModemDlg)
	m_editchar = _T("");
	m_modem = _T("");
	m_com = _T("");
	m_phone = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CModemDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CModemDlg)
	DDX_Control(pDX, IDhangup, m_hangup);
	DDX_Control(pDX, IDcall, m_call);
	DDX_Control(pDX, IDC_EDIT1, m_editctrl);
	DDX_Text(pDX, IDC_EDIT1, m_editchar);
	DDV_MaxChars(pDX, m_editchar, 40);
	DDX_Text(pDX, IDC_EDIT3, m_modem);
	DDX_Text(pDX, IDC_EDIT2, m_com);
	DDX_Text(pDX, IDC_EDIT4, m_phone);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CModemDlg, CDialog)
	//{{AFX_MSG_MAP(CModemDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
	ON_BN_CLICKED(IDcall, Oncall)
	ON_BN_CLICKED(IDhangup, Onhangup)
	ON_WM_CREATE()
	ON_WM_CLOSE()
	ON_WM_TIMER()
	ON_BN_CLICKED(IDEXIT, OnExit)
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CModemDlg message handlers

BOOL CModemDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	GetDlgItem(IDcall)->EnableWindow(FALSE);
    GetDlgItem(IDhangup)->EnableWindow(FALSE);
    GetDlgItem(IDC_EDIT1)->EnableWindow(TRUE);

    
	 vcon=0;
	 sound=20;
	 vconcount=0;
	 ring=0;
	 
 
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE

}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CModemDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CModemDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CModemDlg::OnChangeEdit1() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function to send the EM_SETEVENTMASK message to the control
	// with the ENM_CHANGE flag ORed into the lParam mask.
	
	// TODO: Add your control notification handler code here

 UpdateData();
  if(m_editchar.GetLength())GetDlgItem(IDcall)->EnableWindow(TRUE);
  else GetDlgItem(IDcall)->EnableWindow(FALSE);//无输入时禁止按钮
	

}

void CModemDlg::Oncall() 
{
	// TODO: Add your control notification handler code here
   // m_editctrl.EnableWindow(FALSE);	
	GetDlgItem(IDhangup)->EnableWindow(TRUE);
    GetDlgItem(IDcall)->EnableWindow(FALSE);
    GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE);
  
    m_editctrl.GetWindowText(m_editchar);  
  
 
   char strOutMsg[50]; 
   DWORD dwBytesWritten;
   wsprintf(strOutMsg,"ATDT%s\r",m_editchar);
  


   BOOL bReturn=WriteFile(hCommDev,"AT#CLS=8#VLS=8#VGT=131#VSR=8000\r",strlen("AT#CLS=8#VLS=8#VGT=131#VSR=11025\r"),&dwBytesWritten,NULL);
   if(!bReturn){ m_phone="语音模式设置......失败!";

	 }
    else m_phone="语音模式设置......成功!";

   
	Sleep(500);

   bReturn=WriteFile(hCommDev,strOutMsg,strlen(strOutMsg),&dwBytesWritten,NULL);
	 if(!bReturn){
		//    DWORD dwErrorID=GetLastError();
		//	MessageBox("无法与调制解调器通讯!");
		//	return;
      m_phone="拨号连接......失败!"; 
      UpdateData(FALSE);
	  return;

	 }


  



    m_phone="正在呼叫连接...  "+m_editchar;
	UpdateData(FALSE);


	
	

}

void CModemDlg::Onhangup() 
{
	// TODO: Add your control notification handler code here
	GetDlgItem(IDhangup)->EnableWindow(FALSE);
    GetDlgItem(IDcall)->EnableWindow(TRUE);
	GetDlgItem(IDC_EDIT1)->EnableWindow(TRUE);
    m_editctrl.EnableWindow(TRUE);	
    m_editctrl.GetWindowText(m_editchar);  

    DWORD dwBytesWritten;

  
	
  BOOL bReturn=WriteFile(hCommDev,"\r",strlen("\r"),&dwBytesWritten,NULL);
	 if(!bReturn){
		//    DWORD dwErrorID=GetLastError();
		//	MessageBox("无法与调制解调器通讯!");
		//	return;
      m_phone="挂断连接......失败!"; 
      UpdateData(FALSE);
	  return;

	 }



   Sleep(1000);

   bReturn=WriteFile(hCommDev,"+++",strlen("+++"),&dwBytesWritten,NULL);
	 if(!bReturn){
	//	    DWORD dwErrorID=GetLastError();
	//		MessageBox("无法与调制解调器通讯!");
	//		return;
      m_phone="无法与调制解调器通讯,挂断连接......失败!"; 
      UpdateData(FALSE);
	  return;
	 }

    m_phone="正在挂断连接...  "+m_editchar;
	UpdateData(FALSE);

    Sleep(1000);
    bReturn=WriteFile(hCommDev,"ATZ\r",strlen("ATZ\r"),&dwBytesWritten,NULL);
	 if(!bReturn){
		//    DWORD dwErrorID=GetLastError();
		//	MessageBox("无法与调制解调器通讯!");
		//	return;
      m_phone="无法与调制解调器通讯,挂断连接......失败!"; 
      UpdateData(FALSE);
	  return;

	 }


	 vconcount=0;


}





int CModemDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CDialog::OnCreate(lpCreateStruct) == -1)
		return -1;
	
 

        DCB dcb; 
        char strOutNumber[50]; 
        DWORD dwBytesWritten;
        BOOL bReturn,flagcom=FALSE,flagmodem=FALSE;
        char strOutMsg[20]="ATS0=0V1M0\r";
        
	                         

	hCommDev=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
	if(hCommDev!=(HANDLE)-1)
                         { flagcom=TRUE;

                           BuildCommDCB("COM1:115200,n,8,1",&dcb);
                           SetCommState(hCommDev,&dcb);   //以上为初始化串口
     
                           COMMTIMEOUTS CommTimeOuts;
                           CommTimeOuts.ReadIntervalTimeout=MAXDWORD;
                           CommTimeOuts.ReadTotalTimeoutMultiplier=0;
                           CommTimeOuts.ReadTotalTimeoutConstant=0;
                           CommTimeOuts.WriteTotalTimeoutMultiplier=0;
                           CommTimeOuts.WriteTotalTimeoutConstant=1000;
                           SetCommTimeouts(hCommDev,&CommTimeOuts);
                           PurgeComm(hCommDev,PURGE_TXCLEAR);
                           PurgeComm(hCommDev,PURGE_RXCLEAR); //设置读写串口超时时间


                       
                         bReturn=WriteFile(hCommDev,strOutMsg,strlen(strOutMsg),&dwBytesWritten,NULL);
                         if(!bReturn)flagmodem=FALSE;
	                 else flagmodem=TRUE;
                          } 

         else flagcom=FALSE;

if(flagcom==FALSE||flagmodem==FALSE)
       {
        CloseHandle(hCommDev);
	hCommDev=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
	if(hCommDev!=(HANDLE)-1)
                         { flagcom=TRUE;

                           BuildCommDCB("COM2:115200,n,8,1",&dcb);
                           SetCommState(hCommDev,&dcb);   //以上为初始化串口
     
                           COMMTIMEOUTS CommTimeOuts;
                           CommTimeOuts.ReadIntervalTimeout=MAXDWORD;
                           CommTimeOuts.ReadTotalTimeoutMultiplier=0;
                           CommTimeOuts.ReadTotalTimeoutConstant=0;
                           CommTimeOuts.WriteTotalTimeoutMultiplier=0;
                           CommTimeOuts.WriteTotalTimeoutConstant=1000;
                           SetCommTimeouts(hCommDev,&CommTimeOuts);
                           PurgeComm(hCommDev,PURGE_TXCLEAR);
                           PurgeComm(hCommDev,PURGE_RXCLEAR); //设置读写串口超时时间

                     
                         bReturn=WriteFile(hCommDev,strOutMsg,strlen(strOutMsg),&dwBytesWritten,NULL);
                         if(!bReturn)flagmodem=FALSE;
	                 else flagmodem=TRUE;
                          } 

         else flagcom=FALSE;
			}

if(flagcom==FALSE||flagmodem==FALSE)
       {
        CloseHandle(hCommDev);
	hCommDev=CreateFile("COM3",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
	if(hCommDev!=(HANDLE)-1)
                         { flagcom=TRUE;

                           BuildCommDCB("COM1:115200,n,8,1",&dcb);
                           SetCommState(hCommDev,&dcb);   //以上为初始化串口
     
                           COMMTIMEOUTS CommTimeOuts;
                           CommTimeOuts.ReadIntervalTimeout=MAXDWORD;
                           CommTimeOuts.ReadTotalTimeoutMultiplier=0;
                           CommTimeOuts.ReadTotalTimeoutConstant=0;
                           CommTimeOuts.WriteTotalTimeoutMultiplier=0;
                           CommTimeOuts.WriteTotalTimeoutConstant=1000;
                           SetCommTimeouts(hCommDev,&CommTimeOuts);
                           PurgeComm(hCommDev,PURGE_TXCLEAR);
                           PurgeComm(hCommDev,PURGE_RXCLEAR); //设置读写串口超时时间

                     
                         bReturn=WriteFile(hCommDev,strOutMsg,strlen(strOutMsg),&dwBytesWritten,NULL);
                         if(!bReturn)flagmodem=FALSE;
	                 else flagmodem=TRUE;
                          } 

         else flagcom=FALSE;
			}


if(flagcom==FALSE||flagmodem==FALSE)
       {
        CloseHandle(hCommDev);
	hCommDev=CreateFile("COM4",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
	if(hCommDev==(HANDLE)-1){flagcom=FALSE;
                             }
	else flagcom=TRUE;
	
	BuildCommDCB("COM2:115200,n,8,1",&dcb);
	SetCommState(hCommDev,&dcb);   //以上为初始化串口
        COMMTIMEOUTS CommTimeOuts;
	 CommTimeOuts.ReadIntervalTimeout=MAXDWORD;
	 CommTimeOuts.ReadTotalTimeoutMultiplier=0;
	 CommTimeOuts.ReadTotalTimeoutConstant=0;
	 CommTimeOuts.WriteTotalTimeoutMultiplier=0;
	 CommTimeOuts.WriteTotalTimeoutConstant=1000;
	 SetCommTimeouts(hCommDev,&CommTimeOuts);
	 PurgeComm(hCommDev,PURGE_TXCLEAR);
         PurgeComm(hCommDev,PURGE_RXCLEAR); //设置读写串口超时时间

         bReturn=WriteFile(hCommDev,strOutMsg,strlen(strOutMsg),&dwBytesWritten,NULL);
	 if(!bReturn){flagmodem=FALSE;
	              }
	 else flagmodem=TRUE;
         }    //若MODEM不在COM1口上,则在COM2口上搜索MODEM


    if(flagcom==FALSE)m_com="初始化串口......失败!";
	else  m_com="初始化串口......成功!";
      
	if(flagmodem==FALSE)m_modem="初始化调制解调器......失败!";
	else m_modem="初始化调制解调器......成功!";



	
    SetTimer(1,45,NULL);     //设置55毫秒定时器,用于读取串口数据
    SetTimer(2,400,NULL); 



	return 0;
}

void CModemDlg::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
       
	CloseHandle(hCommDev);
	KillTimer(1);
	KillTimer(2);



	CDialog::OnClose();
}


void CModemDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default

    DWORD dwBytesWritten;
	if(nIDEvent==1){
     char strCommRecvMsg[50];
	 DWORD dwBytesRead;
	 BOOL bReturn=ReadFile(hCommDev,strCommRecvMsg,50,&dwBytesRead,NULL);
	 if(!bReturn)return;
	 if(dwBytesRead<1)return;
     
      CString strTmp,strTmp1; 
      
     strTmp=strCommRecvMsg;	 
     strTmp1=strTmp.Left(dwBytesRead);	 
       
 //    m_phone=strTmp1;  

    

	 if(strstr(strTmp1,"VCON")!=NULL){vcon=1;vconcount++;
	                                   if(vconcount==1) m_phone="检测到对方摘机!";
	                                   else m_phone="挂断电话!";}    
	 else if(strstr(strTmp1,"RING")!=NULL){m_phone="检测到振铃信号!";ring++;}    
    else if(strstr(strTmp1,"BUSY")!=NULL)m_phone="检测到忙音!";  
    else if(strstr(strTmp1,"CONNECT")!=NULL)m_phone="开始语音传送!";
    else if(strstr(strTmp1,"NO DIALTONE")!=NULL)m_phone="无拨号音!";

	
	 UpdateData(FALSE);	
	}
	else if(nIDEvent==2)
	{
		if(vcon==1&&vconcount==1){ vcon=0;
	       	// DWORD dwBytesWritten;
              WriteFile(hCommDev,"AT#VTX\r",strlen("AT#VTX\r"),&dwBytesWritten,NULL);

	
		          }

        		
	}

/*       switch(key)
	   {  
	     
	
		  case 12:if(vconcount==1){
			  //    DWORD dwBytesWritten;
                  WriteFile(hCommDev,"\r",strlen("\r"),&dwBytesWritten,NULL);
	              Sleep(500);
                  WriteFile(hCommDev,"ATZ\r",strlen("ATZ\r"),&dwBytesWritten,NULL);
				  vconcount=0;
                 GetDlgItem(IDhangup)->EnableWindow(FALSE);
                 GetDlgItem(IDcall)->EnableWindow(TRUE);
                  }
                  break;
		
		  default:break;
	   }	  

*/

	CDialog::OnTimer(nIDEvent);
}




void CModemDlg::OnExit() 
{
	// TODO: Add your control notification handler code here
	OnClose();
	EndDialog(1);	
}

void CModemDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
		
	CDialog::OnLButtonDown(nFlags, point);
	PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));

	
}